package store

import (
	"cmp"
	"errors"
	"fmt"
	"server/internal/core/config"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

func initMySQL(config *config.DatabaseConfig) error {
	url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", config.Username, config.Password, config.Host, config.Port, config.Database)
	db, err := gorm.Open(mysql.Open(url), &gorm.Config{})
	if err != nil {
		return err
	}

	sqlDB, err := db.DB()
	if err != nil {
		return err
	}

	// SetMaxIdleConns 设置空闲连接池中连接的最大数量。
	sqlDB.SetMaxIdleConns(cmp.Or(config.MaxIdleConns, 2))

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(cmp.Or(config.MaxOpenConns, 100))

	// SetConnMaxLifetime 设置了可以重新使用连接的最大时间。
	sqlDB.SetConnMaxLifetime(time.Duration(cmp.Or(config.MaxLifetime, 3600)) * time.Second)

	if err := sqlDB.Ping(); err != nil {
		return errors.New("failed to ping database")
	}

	DB = db
	return nil
}
